什麼是 N + 1 problem?
背景:
假設有 User 及 review 兩份表格,使用 user_id 進行關聯,有一個查詢是「找出 20 歲以上使用者的所有評論」
執行狀況:
在查詢時,第一次先找出「所有 20 歲以上的使用者」,假設有五筆資料。
接著在這五筆資料裡面,再把評論撈出來,因此是從第一筆資料查詢到第五筆。
第一次查詢主要的 User 表格,以查詢到的結果,再查詢有關聯的副表格。
這篇文章 什么是 N+1 问题,以及如何解决 說得很好,其實應該要稱作「1 + N」問題。
也就是說,第一次查詢出來是 N 個紀錄,實際執行時需要查詢的次數是 N + 1 次(就執行順序來說,1 + N 次比較合理),這就叫做 N + 1 問題。
為什麼會有這個問題?
查到的資料大部分是說,可能是新手會犯的錯誤,其實用一個 SQL 的 join 就可以了,但是在 ORM 裡面,很有可能會寫出這樣的程式碼。
解決辦法
ORM 相對應的方案:預加載 preload with
參考資料:
Understanding and fixing N+1 query
GraphQL Design: 使用 DataLoader 提升效能 !
心得
對這個問題還不是那麼熟悉,但是目前似乎有初步的理解了,放著之後慢慢研究。